# 7. js正则表达式分组
1. 基础部分可以参考 https://www.runoob.com/jsref/jsref-obj-regexp.html (opens new window)(包含修饰符、方括号、元字符、量词、RegExp 对象方法、支持正则表达式的 String 对象的方法、RegExp 对象属性)
2. 正则表达式中 分组: \1 匹配的是 所获取的第1个()匹配的引用。例如,/(\d)\1/ 匹配两个连续数字字符。如33aa 中的33 \2 匹配的是 所获取的第2个()匹配的引用。 例如,/(\d)(a)\1/ 中,\1必须匹配和第一个一样的数字。如9a9 被匹配,但9a8不会被匹配,因为第三位的\1必须是9才可以。 /(\d)(a)\2/ 中\2必须是a,如,8aa被匹配,但8ab,7a7不会被匹配。 /((\d)(a))\1\2\3/中\1是最外层括号匹配到的,\2是(\d)匹配到的,\3是a。
var reg1='/\d/g';//字符串不是正则表达式,匹配不到
var reg2=/\d/g;//正则表达式,可以匹配到,但是不能是变量
new RegExp('\d','g');//这个是错误的 /d/g
new RegExp('\\d','g');//正确 /\d/g
new RegExp(reg2,'m');//可以有变量 /\d/m
var str='12332144556678978978911233444';
str.match(/(\d)\1/g);//["33", "44", "55", "66", "11", "33", "44"]
str.match(/(\d)\1{2}/g);//["444"]
str.match(/(\d)(\d)(\d)\1\2\3/g);//["789789"]
str.match(/(\d)(\d)(\d)\3\2\1/g);//["123321"]
str.match(/(\d)(\d)(\d)(\1\2\3)+/g);//["789789789"]
str.match(/(\d\d\d)\1+/g);//["789789789"]
str.match(/(\d)\1(\d)\2/g);//["4455", "3344"] 这块没匹配出5566,不知道用正则如何解决,哪位大牛知道回复下。所以最后只想到了用js解决
str.match(/(\d)\1((\d)\3)+/g);//["445566", "3344"]
str.match(/(\d)\1(\d)(\d)\3/g);//["11233"]
//匹配有序的三位数字
str.match(/(0(?=1)|1(?=2)|2(?=3)|3(?=4)|4(?=5)|5(?=6)|6(?=7)|7(?=8)|8(?=9)){2}\d/g);//["123", "678", "789", "789", "123"]
//str是字符串,reg是正则表达式。返回所有匹配项数组
function getmatch(str,reg){
let res=new Set();
let tempStr="";
let index=0;
do{
tempStr=str.substr(index).match(reg);
if(tempStr!==null){
res.add(tempStr[0])
}
++index;
}while (tempStr!==null)
return [...res]
}
console.log(getmatch(str,/(\d)\1(\d)\2/));//["4455", "5566", "3344"]
console.log(getmatch('123456',/(0(?=1)|1(?=2)|2(?=3)|3(?=4)|4(?=5)|5(?=6)|6(?=7)|7(?=8)|8(?=9)){2}\d/));//["123", "234", "345", "456"]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42